home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_07 / wilde / conv2.syn < prev    next >
Text File  |  1993-11-27  |  3KB  |  119 lines

  1. {
  2. /*
  3.  File:   CONV.SYN - AnaGram syntax file for
  4.                     conversion program;
  5.          Version 2
  6. */
  7. #include "string.h"
  8. #include "convutil.h"
  9. }
  10. [
  11.   parser file name = "conv.cpp"
  12. ]
  13.  
  14. grammar
  15.  -> record?..., eof
  16.  
  17. (void) record
  18.  -> valid record, newline                   =cleanUp();
  19.  -> bad data, newline                       =cleanUp();
  20.  
  21. bad data
  22.  -> error               =wrError(PCB.line, PCB.column);
  23.  
  24. (void) valid record
  25.  -> "class", attribute list                =putClass();
  26.  -> "instanceVariable",
  27.        attribute list           =putInstanceVariable();
  28. // six other record types handled similarly
  29.  
  30. attribute list
  31.  -> tab, attribute
  32.  -> attribute list, tab, attribute
  33.  
  34. (void) attribute
  35.  -> "name@", id value:a                =atAdd(NAME, a);
  36.  -> "file@", string value:a           =atAdd(FILEN, a);
  37.  -> "line@", string value:a            =atAdd(LINE, a);
  38. // twelve other attribute types handled similarly
  39.  
  40. // ------------ string value syntax -------------------
  41. (Attribute *) string value
  42.  -> value contents              =makeStringAttribute();
  43.  
  44. // ------------ id value syntax -----------------------
  45. (Attribute *) id value
  46.  -> scoped name:sn,
  47.       name remainder:s          =makeIdAttribute(sn,s);
  48.  
  49. (char *) scoped name
  50.  -> scoped name term:head                        =head;
  51.  -> scoped name:sn, "::",
  52.       scoped name term:t            =extendScope(sn,t);
  53.  
  54. (char *) scoped name term
  55.  -> identifier:i                                    =i;
  56.  
  57. (char *) name remainder
  58.  ->                 =makeHeap(""); //remainder is empty
  59.  -> value contents         =release(); //remaining text
  60.  
  61. // =============== lexical definitions ================
  62. eof              = -1 + 0 + ^Z
  63. name follow char = 'a-z' + 'A-Z' + '_' + '~' + '0-9'
  64. name start char  = 'a-z' + 'A-Z' + '_' + '~'
  65. newline          = '\n'
  66. tab              = '\t'
  67. value char       = ~(eof + tab + '@' + newline)
  68.  
  69. [
  70.   sticky {name string}
  71. ]
  72. (char *) identifier
  73.  -> name string                             =release();
  74.  
  75. (void) name string
  76.  -> name start char:c                 =collectFirst(c);
  77.  -> name string, name follow char:c        =collect(c);
  78.  
  79. (void) value contents
  80.  -> value char:c                      =collectFirst(c);
  81.  -> value contents, value char:c           =collect(c);
  82.  
  83. // Supporting C++ code follows
  84. {
  85.  
  86. StringAttribute *makeStringAttribute() {
  87.   StringAttribute *a = new StringAttribute(release());
  88.   return a;
  89. }
  90.  
  91. IdAttribute *makeIdAttribute(char * sn, char *s) {
  92.   IdAttribute * a;
  93.   a = new IdAttribute(sn,s);
  94.   delete sn;
  95.   delete s;
  96.   return a;
  97. }
  98.  
  99. char* extendScope(char *sn, char *t) {
  100.   char * nsn;   // string for new scoped name
  101.   nsn = new char[strlen(sn) + strlen(t) + 3];
  102.   strcpy(nsn, sn);
  103.   strcat(nsn, "::");
  104.   strcat(nsn, t);
  105.   delete sn;
  106.   delete t;
  107.   return nsn;
  108. }
  109.  
  110. int main(int argc, char * argv[]) {
  111.   if (FALSE == setErrorFile(argv[1])) {
  112.     fprintf(stderr, "Couldn't open error file\n");
  113.     return 1;
  114.   }
  115.   conv();
  116.   return 0;
  117. }
  118. }
  119.